function ones(func) {
    var tag = true;
    return function () {
        if (tag == true) {
            func.apply(null, arguments);
            tag = false;
        } else {
            console.log('已经执行过了')
        }
    }
}

function add(a, b) {
    console.log(a + b)
}
var newAdd = ones(add)
newAdd(1, 3)
newAdd(1, 3)


// 防抖--- 不让频繁执行，指定一个函数在经过指定时间后才能执行，如果在这个时间内再次调用，则重新计时。
// 防抖通常用于搜索框输入文字时的搜索请求，防止用户输入过程中频繁发送请求。
function debounce(fn, space) {
    let task = null;
    return function () {
        //先开启一个定时任务,当再次调用的时候,若定时任务还在存在就清空
        if (task) {
            clearTimeOut(task);
        }
        task = setTimeOut(fn.apply(this, arguments), space);
    }
}

// 节流--- 可以频繁执行，但是是在一定间隔时间内只能执行一次
// 节流通常用于窗口大小改变、鼠标移动等事件，防止这些事件处理器被快速连续调用。
function throttle(fn, space) {
    let task = null;
    return function () {
        if (!task) {
            task = setTimeOut(() => {
                task = null;
                fn.apply(this, arguments);
            }, space)
        }
    }
}

// 如何实现一个私有变量，用getName方法可以访问，不能直接访问
function product() {
    var name = "zhangsan"
    this.getName = function() {
        return name
    }
}
var obj = new product()
console.log(obj.getName())